#include "ota_http_curl.h"
#include "curl/curl.h"
#include "stdlib.h"
#include "string.h"

/**
 * curl 回调函数
 * 参数 1 查询后返回的数据 ，2 数据大小 ，3 数据个数 ，4 结果最后要放入的容器
 */
static size_t ota_http_curl_write_callback(char *data, size_t size, size_t nmemb, void *clientp)
{   ResponseBody *response_body= (ResponseBody *)clientp;
    response_body->response_len=size * nmemb;
    response_body->response_str=(char *)malloc(response_body->response_len+1);
    memcpy(response_body->response_str, data, response_body->response_len);
    response_body->response_str[response_body->response_len]='\0';
    return response_body->response_len;
}

/**
 * 根据 url地址 获得对应返回值 
 * 
 */
ResponseBody *ota_http_curl_get_resp(char *url)
{
    // 初始化curl 
    CURL *curl = curl_easy_init();
    // 设置url 参数  
    //设置地址
    curl_easy_setopt(curl, CURLOPT_URL, url);
    //设置d回调n函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_curl_write_callback);
    //设置回调函数的参数
    ResponseBody *response_body=malloc(sizeof(ResponseBody));

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_body);
    //执行查询
      CURLcode curlcode= curl_easy_perform(curl);
    //判断执行结果
    if(curlcode!=CURLE_OK){
        printf("curl_easy_perform() failed: %s\n",curl_easy_strerror(curlcode));    
        return NULL;
    }
    return response_body;


}


/**
 * 根据地址下载文件到指定的位置
 */
int ota_http_curl_download_file(char *url, char *file_path)
{

        // 初始化curl 
    CURL *curl = curl_easy_init();
    // 设置url 参数  
    //设置地址
    curl_easy_setopt(curl, CURLOPT_URL, url);
    //设置d回调n函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    //设置回调函数的参数
     FILE *file=fopen(file_path,"wb");

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    //执行查询
      CURLcode curlcode= curl_easy_perform(curl);
    //判断执行结果
    if(curlcode!=CURLE_OK){
        printf("curl_easy_perform() failed: %s\n",curl_easy_strerror(curlcode));    
        return -1;
    }
    fclose(file);
    return 0;
}